Allow assign_irq_vector to return an old vector while moving an irq
authorKeir Fraser <keir@xen.org>
Fri, 26 Nov 2010 10:10:40 +0000 (10:10 +0000)
committerKeir Fraser <keir@xen.org>
Fri, 26 Nov 2010 10:10:40 +0000 (10:10 +0000)
commit353c65ce23877d10b13b6ce93725509b1564cff7
tree99d50da91a89c18f525caf8c31ad591bbce50579
parent0bdb3ec667740cbf84fcf41d843f056b428ecdaa
Allow assign_irq_vector to return an old vector while moving an irq

The guest calls assign_irq_vector() to assign one if it doesn't have
one, and to find out the vector if it does have one.

If the cpu mask passed intersects with the existing mask, the old
vector is simply returned.

However, if the irq happens to be in transit at the time, this returns
EBUSY.  This is unnecessary if, as soon as the irq migration succeeds,
the logic would just return the old vector anyway.

This patch makes two changes:
* Switch the checks, so if the mask overlaps it always returns
* Return -EAGAIN instead of -EBUSY for moving irqs, to let the caller
know that the failure is temporary and may work if repeated.

This fixes a bug where on certain hardware, using the credit2
scheduler, a pvops kernel with multiple vcpus doesn't boot.

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
xen/arch/x86/irq.c